package com.guomao.topic;

import com.guomao.util.ConnectionUtil;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

/**
 * 生产者类，用于向RabbitMQ发送不同系统和级别的日志消息
 */
public class Producer {

    public static void main(String[] args) throws Exception {

        // 获取RabbitMQ连接
        Connection connection = ConnectionUtil.getConnection();

        // 创建通道
        Channel channel = connection.createChannel();

        // 定义交换机名称
        String exchangeName = "test_topic";

        // 声明一个TOPIC类型的交换机，参数分别为：交换机名称、类型、持久化、不自动删除、不内部使用、额外参数
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC, true, false, false, null);

        // 定义两个队列的名称
        String queue1Name = "test_topic_queue1";
        String queue2Name = "test_topic_queue2";

        // 声明队列，参数分别为：队列名称、持久化、不独占、不自动删除、额外参数
        channel.queueDeclare(queue1Name, true, false, false, null);
        channel.queueDeclare(queue2Name, true, false, false, null);

        // 绑定队列和交换机  
        // 参数1. queue：队列名称
        // 参数2. exchange：交换机名称
        // 参数3. routingKey：路由键,绑定规则
        //      如果交换机的类型为fanout ,routingKey设置为""
        // routing key 常用格式：系统的名称.日志的级别。  
        // 需求： 所有error级别的日志存入数据库,所有order系统的日志存入数据库  
        // 将队列1绑定到交换机，使用#.error路由键，匹配所有error级别的日志
        channel.queueBind(queue1Name, exchangeName, "#.error");
        // 将队列1绑定到交换机，使用order.*路由键，匹配order系统的所有日志
        channel.queueBind(queue1Name, exchangeName, "order.*");
        // 将队列2绑定到交换机，使用*.*路由键，匹配所有系统的所有日志
        channel.queueBind(queue2Name, exchangeName, "*.*");

        // 分别发送消息到队列：order.info、goods.info、goods.error  
        String body = "[所在系统：order][日志级别：info][日志内容：订单生成，保存成功]";
//        channel.basicPublish(exchangeName, "order.info", null, body.getBytes());

//        body = "[所在系统：goods][日志级别：info][日志内容：商品发布成功]";
//        channel.basicPublish(exchangeName, "goods.info", null, body.getBytes());

        body = "[所在系统：goods][日志级别：error][日志内容：商品发布失败]";
        channel.basicPublish(exchangeName, "goods.error", null, body.getBytes());

        channel.close();
        connection.close();

    }

}